package com.hspedu.polymorphic_.dynamic_;

/**
 * Java的动态绑定机制：
 * 1.当调用对象方法的时候，该方法会和该对象的 内存地址/运行类型 绑定
 * 2.当调用对象属性时，没有动态绑定机制，哪里声明，就在哪里使用
 */
public class DynamicBinding2 {
    public static void main(String[] args) {
        //c的编译类型为C，运行类型为D
        C c = new D();//向上转型

        /**
         * 先找运行时对象D，看有没有sum()这个方法，没有就找父类C里面的sum()方法，
         * 然后sum()方法中调用了getI()方法，而子类和父类中都有getI方法，
         * 因为是运行类型，所以调用的是子类的getI(), return i 的时候找的是该方法所在对象中的i属性
         * i=20 -> sum()=20+10=30
         */
        System.out.println(c.sum());


        /**
         * 找运行类型D，里面没有sum1()这个方法，找到C里面的sum1()方法，
         * 找属性i，因为调用对象属性时，没有动态绑定机制，哪里声明就在哪里使用，i调用的是C中的属性
         * i=10，sum1()返回20
         */
        System.out.println(c.sum1());
    }
}

class C{
    public int i = 10;
    public int sum(){
        return getI()+10;
    }
    public int sum1(){
        return i + 10;
    }
    public int getI(){
        return i;
    }
}

class D extends C{
    public int i = 20;
//    public int sum(){
//        return i +20;
//    }
    public int getI(){
        return i;
    }
//    public int sum1(){
//        return i + 10;
//    }
}